<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Pro Git - 简体中文版
</title>
    <meta content="http://www.w3.org/1999/xhtml; charset=utf-8" http-equiv="Content-Type"/>
    <link href="stylesheet.css" type="text/css" rel="stylesheet"/>
    <style type="text/css">
		@page { margin-bottom: 5.000000pt; margin-top: 5.000000pt; }</style>
  </head>
  <body class="calibre">
<h2 id="calibre_toc_33" class="calibre3">在服务器部署 Git</h2>

<p class="calibre2">开始架设 Git 服务器的时候，需要把一个现存的仓库导出为新的纯仓库——不包含当前工作目录的仓库。方法非常直截了当。
把一个仓库克隆为纯仓库，可以使用 clone 命令的 <code class="calibre9">--bare</code> 选项。纯仓库的目录名以 <code class="calibre9">.git</code> 结尾， 如下：</p>

<pre class="calibre8"><code class="calibre9">$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/
</code></pre>

<p class="calibre2">该命令的输出有点迷惑人。由于 <code class="calibre9">clone</code> 基本上等于 <code class="calibre9">git init</code> 加 <code class="calibre9">git fetch</code>，这里出现的就是 <code class="calibre9">git init</code> 的输出，它建立了一个空目录。实际的对象转换不会有任何输出，不过确实发生了。现在在 <code class="calibre9">my_project.git</code> 中已经有了一份 Git 目录数据的副本。</p>

<p class="calibre2">大体上相当于</p>

<pre class="calibre8"><code class="calibre9">$ cp -Rf my_project/.git my_project.git
</code></pre>

<p class="calibre2">在配置文件中有几个小改变；不过从效果角度讲，克隆的内容是一样的。它仅包含了 Git 目录，没有工作目录，并且专门为之（译注： Git 目录）建立了一个单独的目录。</p>

<h3 id="calibre_toc_133" class="calibre4">将纯目录转移到服务器</h3>

<p class="calibre2">有了仓库的纯副本以后，剩下的就是把它放在服务器上并设定相关的协议。假设一个域名为 <code class="calibre9">git.example.com</code> 的服务器已经架设好，并可以通过 SSH 访问，而你想把所有的 Git 仓库储存在 <code class="calibre9">/opt/git</code> 目录下。只要把纯仓库复制上去：</p>

<pre class="calibre8"><code class="calibre9">$ scp -r my_project.git user@git.example.com:/opt/git
</code></pre>

<p class="calibre2">现在，其他对该服务器具有 SSH 访问权限并可以读取 <code class="calibre9">/opt/git</code> 的用户可以用以下命令克隆：</p>

<pre class="calibre8"><code class="calibre9">$ git clone user@git.example.com:/opt/git/my_project.git
</code></pre>

<p class="calibre2">假如一个 SSH 用户对 <code class="calibre9">/opt/git/my_project.git</code> 目录有写权限，他会自动具有推送权限。这时如果运行 <code class="calibre9">git init</code> 命令的时候加上 <code class="calibre9">--shared</code> 选项，Git 会自动对该仓库加入可写的组。</p>

<pre class="calibre8"><code class="calibre9">$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared
</code></pre>

<p class="calibre2">可见选择一个 Git 仓库，创建一个纯的版本，最后把它放在你和同事都有 SSH 访问权的服务器上是多么容易。现在已经可以开始在同一项目上密切合作了。</p>

<p class="calibre2">值得注意的是，这的的确确是架设一个少数人具有连接权的 Git 服务的全部——只要在服务器上加入可以用 SSH 接入的帐号，然后把纯仓库放在大家都有读写权限的地方。一切都做好了，无须更多。</p>

<p class="calibre2">下面的几节中，你会了解如何扩展到更复杂的设定。这些内容包含如何避免为每一个用户建立一个账户，给仓库添加公共读取权限，架设网页界面，使用 Gitosis 工具等等。然而，只是和几个人在一个不公开的项目上合作的话，仅仅是一个 SSH 服务器和纯仓库就足够了，请牢记这一点。</p>

<h3 id="calibre_toc_134" class="calibre4">小型安装</h3>

<p class="calibre2">如果设备较少或者你只想在小型的开发团队里尝试 Git ，那么一切都很简单。架设 Git 服务最复杂的方面之一在于账户管理。如果需要仓库对特定的用户可读，而给另一部分用户读写权限，那么访问和许可的安排就比较困难。</p>

<h4 class="calibre13">SSH 连接</h4>

<p class="calibre2">如果已经有了一个所有开发成员都可以用 SSH 访问的服务器，架设第一个服务器将变得异常简单，几乎什么都不用做（正如上节中介绍的那样）。如果需要对仓库进行更复杂的访问控制，只要使用服务器操作系统的本地文件访问许可机制就行了。</p>

<p class="calibre2">如果需要团队里的每个人都对仓库有写权限，又不能给每个人在服务器上建立账户，那么提供 SSH 连接就是唯一的选择了。我们假设用来共享仓库的服务器已经安装了 SSH 服务，而且你通过它访问服务器。</p>

<p class="calibre2">有好几个办法可以让团队的每个人都有访问权。第一个办法是给每个人建立一个账户，直截了当但过于繁琐。反复的运行 <code class="calibre9">adduser</code> 并且给所有人设定临时密码可不是好玩的。</p>

<p class="calibre2">第二个办法是在主机上建立一个 <code class="calibre9">git</code> 账户，让每个需要写权限的人发送一个 SSH 公钥，然后将其加入 <code class="calibre9">git</code> 账户的 <code class="calibre9">~/.ssh/authorized_keys</code> 文件。这样一来，所有人都将通过 <code class="calibre9">git</code> 账户访问主机。这丝毫不会影响提交的数据——访问主机用的身份不会影响commit的记录。</p>

<p class="calibre2">另一个办法是让 SSH 服务器通过某个 LDAP 服务，或者其他已经设定好的集中授权机制，来进行授权。只要每个人都能获得主机的 shell 访问权，任何可用的 SSH 授权机制都能达到相同效果。</p>

</body>
</html>
